package habitant;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class Armee {

	private Map<Soldat, Integer> attaque;
	private Map<Soldat, Integer> defense;

	public Armee(){
		this.attaque = new HashMap<Soldat, Integer>();
		this.defense = new HashMap<Soldat, Integer>();
		for (Soldat s : SoldatManager.getAll()){
			this.attaque.put(s, 0);
			this.defense.put(s, 0);
		}
	}
	
	public void setAttaque(Map<Soldat, Integer> attaque) {
		this.attaque = attaque;
	}

	public void setDefense(Map<Soldat, Integer> defense) {
		this.defense = defense;
	}

	public Map<Soldat, Integer> getAtt() {
		return attaque;
	}

	public Map<Soldat, Integer> getDef() {
		return defense;
	}

	public Map<Soldat, Integer> getCacAtt() {
		Map<Soldat, Integer> tmp = new HashMap<Soldat, Integer>();
		for (Entry<Soldat, Integer> entry : this.attaque.entrySet()) {
			if (entry.getKey().get_type().equals("cac"))
				tmp.put(entry.getKey(), entry.getValue());
		}
		return tmp;
	}

	public Map<Soldat, Integer> getCacDef() {
		Map<Soldat, Integer> tmp = new HashMap<Soldat, Integer>();
		for (Entry<Soldat, Integer> entry : defense.entrySet()) {
			if (entry.getKey().get_type().equals("cac"))
				tmp.put(entry.getKey(), entry.getValue());
		}
		return tmp;

	}

	public Map<Soldat, Integer> getDistAtt() {
		Map<Soldat, Integer> tmp = new HashMap<Soldat, Integer>();
		for (Entry<Soldat, Integer> entry : attaque.entrySet()) {
			if (entry.getKey().get_type().equals("dist"))
				tmp.put(entry.getKey(), entry.getValue());
		}
		return tmp;

	}

	public Map<Soldat, Integer> getDistDef() {
		Map<Soldat, Integer> tmp = new HashMap<Soldat, Integer>();
		for (Entry<Soldat, Integer> entry : defense.entrySet()) {
			if (entry.getKey().get_type().equals("dist"))
				tmp.put(entry.getKey(), entry.getValue());
		}
		return tmp;

	}

	public void removeDef(Soldat key) {
		this.defense.remove(key);
	}

	public void removeAtt(Soldat key) {
		this.attaque.remove(key);
	}

	public void setDef(Soldat key, int value) {
		this.defense.put(key, value);
	}

	public void setAtt(Soldat key, int value) {
		this.attaque.put(key, value);
	}

	public void addDef(Map<Soldat, Integer> nouvellesRecrues) {
		for (Entry<Soldat, Integer> entry : nouvellesRecrues.entrySet()){
			this.defense.put(entry.getKey(), this.defense.get(entry.getKey())+entry.getValue());
		}		
	}
	
	public void addatt(Map<Soldat, Integer> nouvellesRecrues) {
		for (Entry<Soldat, Integer> entry : nouvellesRecrues.entrySet()){
			this.attaque.put(entry.getKey(), this.attaque.get(entry.getKey())+entry.getValue());
		}		
	}

	public int getNbSoldats() {
		int sum=0;
		for (Entry<Soldat, Integer> e : this.attaque.entrySet()){
			sum += e.getValue();
		}
		for (Entry<Soldat, Integer> e : this.defense.entrySet()){
			sum += e.getValue();
		}
		return sum;
	}

	public void setStrat(Soldat s, int nbAtt, int nbDef) throws StrategieImpossibleException {
		if (nbAtt+nbDef!=this.getNbTot(s))
			throw new StrategieImpossibleException();
		this.setAtt(s, nbAtt);
		this.setDef(s, nbDef);
	}

	private int getNbTot(Soldat s) {
		return this.attaque.get(s)+this.defense.get(s);
	}
}
